package utils.common;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * description: 基于jackson库的json工具类<br>
 * createTime: 2020/11/2 15:24 <br>
 *
 * @author zzh
 */
public class JsonUtils {
    static ObjectMapper mapper = new ObjectMapper();

    static {
        mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
    }

    private JsonUtils() {}

    /**
     *
     * 方法名称：json序列化
     * 方法描述: <br>
     *
     * @param t       待序列化实例
     * @return String 返回字符串
     * @throw JsonProcessingException
     * <p>创建人：周志辉
     * <p>创建时间：2020/11/23 16:56
     */
    public static <T> String toJsonString(T t) throws JsonProcessingException {
        return mapper.writeValueAsString(t);
    }

    /**
     *
     * 方法名称：json反序列化
     * 方法描述: <br>
     *
     * @param json      待反序列化字符串
     * @param tClass    目标类型
     * @return T        返回实例
     * @throw IOException
     * <p>创建人：周志辉
     * <p>创建时间：2020/11/23 16:57
     */
    public static <T> T fromJson(String json, Class<T> tClass) throws IOException {
        return mapper.readValue(json, tClass);
    }

    /**
     *
     * 方法名称：带泛型目标类型的反序列化
     * 方法描述: <br>
     *
     * @param json          待反序列化字符串
     * @param typeReference 目标类型
     * @return T        返回实例
     * @throw IOException
     * <p>创建人：周志辉
     * <p>创建时间：2020/11/23 16:58
     */
    public static <T> T fromJson(String json, TypeReference<T> typeReference) throws IOException {
        return mapper.readValue(json, typeReference);
    }


    public static JsonNode fromJson(String json) throws IOException {
        return mapper.readTree(json);
    }

    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(i + "");
        }
        String json = toJsonString(list);
        System.out.println(json);
        List<String> result = fromJson(json, new TypeReference<List<String>>() {});
        System.out.println(result);

        ArrayList result2 = fromJson(json, ArrayList.class);
        System.out.println(result2);
        System.out.println("over");
    }
}
